package main

import (
	"fmt"
	"time"
)

//write Data :就是放50个数据到intChan管道，然后就关闭intChan管道
func writeData(intChan chan int) {
	for i := 1; i <= 50; i++ {
		//放入数据
		intChan <- i //因为管道长度为10，要放入50个数据，当管道满时，就会在此处阻塞，然后报dead lock(管道满了，你还要往里添，管道爆了)
		fmt.Println("writeData ", i)
		//time.Sleep(time.Second)
	}
	close(intChan) //关闭
}

//read data: 循环从intChan管道取数据。取完之后，向exitChan管道中添加 true，并关闭exitChan管道
func readData(intChan chan int, exitChan chan bool) {
	for {
		v, ok := <-intChan
		if !ok {
			break
		}
		fmt.Printf("readData 读到数据=%v\n", v)
	}
	//readData 读取完数据后，即任务完成
	exitChan <- true
	close(exitChan)
}

func sleep() {
	time.Sleep(time.Second * 10)
}

func main() {
	//创建两个管道
	intChan := make(chan int, 10)
	exitChan := make(chan bool, 1)

	//go sleep()

	go writeData(intChan)
	//go readData(intChan, exitChan)

	//time.Sleep(time.Second * 10)
	//不断从exitChan管道取数据，如果取不到了，那么直接向下走
	//for {
	//	_, ok := <-exitChan //这里是从管道中取数据，因为使用了协程，会在这里阻塞
	//	if !ok {            //就算协程压根没对管道做操作，主线程也要等到所有协程执行完毕后，才会从管道中取出数据
	//		break
	//	}
	//}

	result := <-exitChan
	fmt.Println(result)
}
